import { readFileSync, writeFileSync } from 'fs'
import { resolve, dirname } from 'path'
import { fileURLToPath } from 'url'

// 数字补零处理
function formatNumber(num) {
  return num.toString().padStart(2, '0')
}

// 常量配置
const BALL_SIZE = 33 // 数字范围1-33
const BALL_LEN = 6 // 每期包含6个数字
const BASE_PERIODS = 20 // 固定分母：20期
const __dirname = dirname(fileURLToPath(import.meta.url))
const dataPath = resolve(__dirname, './ssq.json')
const outputPath = resolve(__dirname, 'times.txt') // 合并后的总文件

// 读取并解析数据
const rawData = readFileSync(dataPath, 'utf-8')
const data = JSON.parse(rawData)
const actualPeriods = data.length // 实际数据期数（最多20期）

try {
  // 数据整体验证
  data.forEach((draw, drawIndex) => {
    if (!Array.isArray(draw) || draw.length !== BALL_LEN) {
      throw new Error(`第${drawIndex + 1}期数据错误: 需包含${BALL_LEN}个数字`)
    }
    draw.forEach((num, numIndex) => {
      if (
        typeof num !== 'string' ||
        !/^\d{2}$/.test(num) ||
        parseInt(num) < 1 ||
        parseInt(num) > BALL_SIZE
      ) {
        throw new Error(`第${drawIndex + 1}期第${numIndex + 1}个数字错误: ${num}`)
      }
    })
  })

  // 收集所有统计内容的数组（用于最后合并）
  const allContent = []

  // 循环处理：依次取 1 条、2 条...直到取完所有期数
  for (let n = 1; n <= actualPeriods; n++) {
    // 取前 n 期数据
    const currentData = data.slice(0, n)
    // 统计当前 n 期内数字的出现次数
    const numCounts = {}
    currentData.flat().forEach((num) => {
      numCounts[num] = (numCounts[num] || 0) + 1
    })

    // 计算百分比并分组
    const percentGroups = {}
    Object.entries(numCounts).forEach(([num, count]) => {
      const percent = Math.round((count / BASE_PERIODS) * 100).toString()
      if (!percentGroups[percent]) {
        percentGroups[percent] = []
      }
      percentGroups[percent].push(num)
    })

    // 处理未出现的数字（0%）
    const allPossibleNums = Array.from({ length: BALL_SIZE }, (_, i) => formatNumber(i + 1))
    const zeroPercentNums = allPossibleNums.filter((num) => !numCounts.hasOwnProperty(num))
    if (zeroPercentNums.length > 0) {
      percentGroups['0'] = zeroPercentNums
    }

    // 生成当前 n 期的统计内容
    const currentContent = [
      `=== 累计统计（取前 ${n} 期数据，按 20 期基数计算百分比） ===`,
      '按出现百分比降序排列（百分比 = 出现次数 / 20 × 100%）',
      '',
    ]

    // 按百分比排序并添加到当前内容
    Object.entries(percentGroups)
      .sort(([p1], [p2]) => parseInt(p2) - parseInt(p1))
      .forEach(([percent, nums]) => {
        const sortedNums = nums.sort((a, b) => parseInt(a) - parseInt(b))
        currentContent.push(`${formatNumber(percent)}%: ${sortedNums.join(', ')}`)
      })

    // 将当前内容添加到总数组（最后一次循环不加分隔符）
    allContent.push(...currentContent)
    if (n !== actualPeriods) {
      allContent.push('---separator---') // 非最后一次添加分隔符
    }
  }

  // 写入合并后的文件
  writeFileSync(outputPath, allContent.join('\n'), 'utf-8')
  console.log(`所有统计已合并完成！已保存至: ${outputPath}`)
} catch (err) {
  console.error('错误: ', err.message)
  process.exit(1)
}
